package com.xyz.apis.common.aspect;

import com.alibaba.fastjson.JSONObject;
import com.sc.base.common.exception.RRException;
import com.xyz.apis.common.annotation.Idempotent;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class IdempotentAspect {

    private Logger logger = LoggerFactory.getLogger(IdempotentAspect.class);


    @Around("@annotation(idempotent)")
    public Object aroundMethod(ProceedingJoinPoint pjp, Idempotent idempotent)throws Throwable {
        /**获取执行方法的参数*/
        Object[] args = pjp.getArgs();

        /**获取注解传入的超时时间*/
        int timeOut = idempotent.value();

        /**使用MD5对传入的参数进行加密*/
        String encode = getMd5Value(args);

        try{
            /** 校验是否重复提交过，如果没有，则按指定超时时间存入Redis缓存 */
            boolean checkFormToken =false;//jedisService.checkForm(encode,timeOut);
            if (checkFormToken) {
                /**这是一个自定义的异常类，可以自己编写*/
                throw new RRException("表单内容已经提交",500);
            }
            /**继续执行方法*/
            return pjp.proceed();
        } catch (Exception e){
            logger.error("幂等性校验出错：" + e.getMessage(), e);
            throw e;
        }
    }
    /**
     * 使用MD5对传入的参数进行加密
     * @param args
     * @return
     */
    private String getMd5Value(Object[] args) {
        String md5 = "null";
        if (args.length == 0) {
            return md5;
        } else {
            StringBuilder jsonString = new StringBuilder(JSONObject.toJSONString(args));
            /**使用md5工具类对字符串进行加密*/
            md5 = "";// MD5Util.toMD5String(jsonString.toString());
        }
        return md5;
    }
}
